/**
 * Classe che permette all'utente di poter inserire i propri dati, accedere/uscire dal servizio,
 * vedere l'attività della serata e di poter partecipare al gioco a quiz
 * l'utente admin ha dei privilegi rispetto agli utenti normali come poter modificare le domande,
 * aggiungere le serate
 * 
 * @author Lorenza Brusini, Marco Jerome Gasparrini, Francesca Magistrelli
 * @version 07/2012
 * 
 */

package jflsoft.classi;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

abstract class Utente {
     
    private List<DatiPersonali> utenti;
    private boolean menu;
    private String nomefile;
    private List<String> progSer;
    private List<Domande> Domande;
    private List File;
    private boolean admin = false;
            
    public void addSerata(String User, String Pass, String serata) {
        
        if(admin==true){
            progSer.add(serata);}
        else 
            System.out.println("Autenticazione fallita");
    }
    
    public List<Domande>  getDomande() {
        if(admin==true)
        return this.Domande;
        else {
            System.out.println("Autenticazione fallita");
            return null;
        }
    }
    
    public void addDomande(String domanda, String[] risposte, int ex) {
        
        if(admin==true){
        for(int i = 0;i < Domande.size(); i++) {

            if(Domande.get(i).getDomanda().equals(domanda)) {
                
                System.out.println("Domanda già presente");
                return;              
            
            }
        
        }
        
        Domande.add(new Domande(domanda,risposte,ex));
        salva();
        } else 
            System.out.println("Autenticazione fallita");
    
   }
    
   public void removeDomanda(){
      
       if(admin==true){
        Domande = new ArrayList<Domande>();
        salva();}
        else 
            System.out.println("Autenticazione fallita");
    
   }
    
   public void login() {
   
        String os = System.getProperty("os.name");
        String home = System.getProperty("user.home");
        
        if(os.equals("Linux") || os.contains("OSX"))
            this.nomefile = home+"/JFLconf.conf";
        else
            this.nomefile = home+"\\JFLconf.conf";
                
        try {
  
            FileInputStream istream = new FileInputStream(nomefile);
            ObjectInputStream p = new ObjectInputStream(istream);
            
            this.File = (List)p.readObject(); 
            this.utenti = (List<DatiPersonali>) File.get(0);
            this.progSer = (List<String>)File.get(1);
            this.Domande = (List<Domande>) File.get(2);

            istream.close();
        } 
        catch (Exception e) { 
            System.out.println("Errore di lettura o prima apertura, procedo con la creazione del File");
            File file = new File(nomefile);
            File = new ArrayList();
            utenti = new ArrayList<DatiPersonali>();
            progSer = new ArrayList<String>();
            Domande = new ArrayList<Domande>();
            salva();
        }
        
    }
   
   public void saldoPunti(String name, String pass){
       
        try{
            
            System.out.println(utenti.get(checkUtente(name,pass)));
            
       }catch( Exception e) { System.out.println("Utente inesistente");}
       
       
   }
    
   public void sudo(String name, String pass){
       
       try{
            if(utenti.get(checkUtente(name,pass)).isAdmin())
                this.admin = true;
            System.out.println("Autenticazione riuscita");
       }catch( Exception e) { System.out.println("Autenticazione fallita");}
       
   }
   
    public String toString() {
        
        String temp = "Il numero di Utenti totali è "+this.utenti.size()+".\n";
        for(int i=0;i<this.utenti.size();i++) {
            
            temp += this.utenti.get(i)+"\n";
        
        }
        
        return temp;
    
    }

    private void salva() {
        
        try {
            FileOutputStream ostream = new FileOutputStream(nomefile);
            ObjectOutputStream p = new ObjectOutputStream(ostream);
            
            File = new ArrayList();
            File.add(utenti);
            File.add(progSer);        
            File.add(Domande);
            p.writeObject(File);

            p.flush();
            ostream.close();
  
        } 
        
        catch (Exception e) {
            
            System.out.println("Scrittura fallita "+e);
        
        }

    }
     
    public void registrazione(String name, String pass, String mail,boolean Partecipazione) {
        
        if(checkUtente(name,pass)!=-1) {
            
            System.out.println("Utente già registrato");
            return;
        
        }
        
        DatiPersonali utente = new DatiPersonali(name,pass);
        utente.setMail(mail);
        utente.setPartecipazioneQuiz(Partecipazione);
        if(name.equals("Admin") && pass.equals("admin"))
            utente.setAdmin(true);
        this.utenti.add(utente); 
        salva();
        System.out.println("Utente registrato con successo.");
    
    }
    
    private int checkUtente(String name,String pass) {
         
        for(int i=0; i<this.utenti.size(); i++) {
            
            if(name.equals(this.utenti.get(i).getNome()) && pass.equals(this.utenti.get(i).getPass()))
                
                return i;
        
        }
        
        return -1;
     
    }
    
    public List invioProgrammaSerate() {
        
        return progSer;
    
    }
    
    public void logout(String name, String pass) {
        
        if(admin==true);{
        if(checkUtente(name,pass)== -1) return;
        this.utenti.remove(checkUtente(name,pass));
    }
    
    }
    
    public boolean aggiornamentoSconti(String user, String pass, int punti) {
        
        if(admin==true){
        int ind = checkUtente(user,pass);
        if(ind==-1) return false;
        DatiPersonali u = this.utenti.remove(ind);
        if(u.getPuntiOmaggio()+punti>=8) {
            
            u.setPuntiOmaggio(u.getPuntiOmaggio()+punti-8); 
            this.utenti.add(ind, u);
            salva();
            return true;
        
        } 
        
        else {
            
            u.setPuntiOmaggio(u.getPuntiOmaggio()+punti); 
            this.utenti.add(ind, u);
            salva();
            return false;            
        
        }  
        } else 
            System.out.println("Autenticazione fallita");return false;
    }
    
}
